package com.huida.app.java8.search_and_match;

import com.huida.app.java8.sort.Employee;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Optional;
import java.util.function.Predicate;

/**
 * @author wangzhuangzhuang
 * @DESC:
 * @date 2022-01-24 11:10
 */
public class StreamSearchAndMatchDemo {


	/**
	 * 查找员工列表中是否包含年龄大于70的员工
	 */
	private static void test01(ArrayList<Employee> emps){
		// common way
		boolean isExistAgeThan70 = false;
		for(Employee emp : emps){
			if(emp.getAge() > 70){
				isExistAgeThan70 = true;
				break;
			}
		}


		// java8 way [anyMatch]，判断Stream流中是否包含某一个“匹配规则”的元素。这个匹配规则可以是lambda表达式或者谓词。

		// - style01
//		boolean isExistAgeThan70Style01 = emps.stream().anyMatch(Employee.ageGreaterThan70);

		// - style02
		boolean isExistAgeThan70Style02 = emps.stream().anyMatch(e -> (e.getAge() > 70));

		// 是否所有员工的年龄都大于10岁？ allMatch匹配规则函数：判断Stream流中的所有元素都符合某一个匹配规则
		boolean isExistAgeThan10 = emps.stream().allMatch(e -> e.getAge() > 10);

		// 是否不存在小于18岁的员工？ noneMatch匹配规则函数： 判断是否Stream流中的所有元素都不符合某一个匹配规则
		boolean isExistAgeLess18 = emps.stream().noneMatch(e -> e.getAge() < 18);
	}

	/**
	 * 元素查找与Optional
	 * DESC: 从列表中按照顺序查找第一个年龄大于40的员工
	 * */
	private static void test02(){
		Employee e1 = new Employee(1, 23, "M", "Rick", "Beethovan");
		Employee e2 = new Employee(2, 13, "F", "Martina", "Hengis");
		Employee e3 = new Employee(3, 43, "M", "Ricky", "Martin");
		Employee e4 = new Employee(4, 26, "M", "Jon", "Lowman");
		Employee e5 = new Employee(5, 19, "F", "Cristine", "Maria");
		Employee e6 = new Employee(6, 15, "M", "David", "Feezor");
		Employee e7 = new Employee(7, 68, "F", "Melissa", "Roy");
		Employee e8 = new Employee(8, 79, "M", "Alex", "Gussin");
		Employee e9 = new Employee(9, 15, "F", "Neetu", "Singh");
		Employee e10 = new Employee(10, 45, "M", "Naveen", "Jain");
		List<Employee> emps = Arrays.asList(e1, e2, e3, e4, e5, e6, e7, e8, e9, e10);
		Optional<Employee> empOptional01 = emps.stream().filter(e -> e.getAge() > 40).findFirst();
		System.out.println(empOptional01.get());
	}
	/*
	* Optional类代表一个值存在或者不存在，在java8中引入，
	*  - isPresent()： 将在Optional包含值的时候返回true，否则返回false。
	*  - ifPresent(Consumer block): 会在值存在的时候执行给定的代码块
	*  - T get()会在值存在时返回值，否则出现NoSuchElement异常。
	*  - T orElse(T other)会在值存在时返回值，否则返回一个默认值。
	*  - findFirst用于查找第一个符合“匹配规则”的元素，返回值为Optional
	*  - findAny用于查找任意一个符合“匹配规则”的元素，返回值为Optional
	* */

	public static void main(String[] args) {
		test02(); // Employee(id=3, age=43, gender=M, firstName=Ricky, lastName=Martin)
	}
}